{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "XuXWJLEm2UWS"
   },
   "source": [
    "# **CS224W - Colab 1**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8gzsP50bF6Gb"
   },
   "source": [
    "In this Colab, we will write a full pipeline for **learning node embeddings**.\n",
    "We will go through the following 3 steps.\n",
    "\n",
    "To start, we will load a classic graph in network science, the [Karate Club Network](https://en.wikipedia.org/wiki/Zachary%27s_karate_club). We will explore multiple graph statistics for that graph.\n",
    "\n",
    "We will then work together to transform the graph structure into a PyTorch tensor, so that we can perform machine learning over the graph.\n",
    "\n",
    "Finally, we will finish the first learning algorithm on graphs: a node embedding model. For simplicity, our model here is simpler than DeepWalk / node2vec algorithms taught in the lecture. But it's still rewarding and challenging, as we will write it from scratch via PyTorch.\n",
    "\n",
    "Now let's get started!\n",
    "\n",
    "**Note**: Make sure to **sequentially run all the cells**, so that the intermediate variables / packages will carry over to the next cell"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Nwwq0nSdmsOL"
   },
   "source": [
    "# 1 Graph Basics\n",
    "To start, we will load a classic graph in network science, the [Karate Club Network](https://en.wikipedia.org/wiki/Zachary%27s_karate_club). We will explore multiple graph statistics for that graph."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FDkpByYYfSzb"
   },
   "source": [
    "## Setup\n",
    "We will heavily use NetworkX in this Colab."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "VWPkJjPAfVNW"
   },
   "outputs": [],
   "source": [
    "import networkx as nx"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VqUnYT5qUZYh"
   },
   "source": [
    "## Zachary's karate club network\n",
    "\n",
    "The [Karate Club Network](https://en.wikipedia.org/wiki/Zachary%27s_karate_club) is a graph describes a social network of 34 members of a karate club and documents links between members who interacted outside the club."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "id": "VIETqEfrfy5Y"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'networkx.classes.graph.Graph'>\n"
     ]
    }
   ],
   "source": [
    "G = nx.karate_club_graph()\n",
    "\n",
    "# G is an undirected graph\n",
    "print(type(G))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "id": "hDvf3nm-ors4"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize the graph\n",
    "nx.draw(G, with_labels = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mr. Hi\n",
      "Officer\n",
      "34\n"
     ]
    }
   ],
   "source": [
    "#数据官方文档示例（来源：https://networkx.org/documentation/stable/auto_examples/graph/plot_karate_club.html）\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx\n",
    "\n",
    "G = nx.karate_club_graph()\n",
    "#print(\"Node Degree\")\n",
    "for v in G:\n",
    "    #print(f\"{v:4} {G.degree(v):6}\")\n",
    "    pass\n",
    "\n",
    "#nx.draw_circular(G, with_labels=True)\n",
    "#plt.show()\n",
    "\n",
    "#https://networkx.org/documentation/stable/reference/generated/networkx.generators.social.karate_club_graph.html\n",
    "#Each node in the returned graph has a node attribute ‘club’ that indicates the name of the club to which the member represented by that node belongs, either ‘Mr. Hi’ or ‘Officer’.\n",
    "G = nx.karate_club_graph()\n",
    "print(G.nodes[5][\"club\"])\n",
    "print(G.nodes[9][\"club\"])\n",
    "print(G.number_of_nodes())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "G.is_directed()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "78"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "G.number_of_edges()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FX25Y1CrYmgN"
   },
   "source": [
    "## Question 1: What is the average degree of the karate club network? (5 Points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {
    "id": "AUhES1VYo3tB"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average degree of karate club network is 5\n"
     ]
    }
   ],
   "source": [
    "def average_degree(num_edges, num_nodes):\n",
    "  # TODO: Implement this function that takes number of edges\n",
    "  # and number of nodes, and returns the average node degree of \n",
    "  # the graph. Round the result to nearest integer (for example \n",
    "  # 3.3 will be rounded to 3 and 3.7 will be rounded to 4)\n",
    "\n",
    "  avg_degree = 0\n",
    "\n",
    "  ############# Your code here ############\n",
    "  avg_degree=round(2*num_edges/num_nodes)\n",
    "  #########################################\n",
    "\n",
    "  return avg_degree\n",
    "\n",
    "num_edges = G.number_of_edges()\n",
    "num_nodes = G.number_of_nodes()\n",
    "avg_degree = average_degree(num_edges, num_nodes)\n",
    "print(\"Average degree of karate club network is {}\".format(avg_degree))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Fk02fD4vYmZI"
   },
   "source": [
    "## Question 2: What is the average clustering coefficient of the karate club network? (5 Points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "metadata": {
    "id": "k15XKEto1aYJ"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average clustering coefficient of karate club network is 0.57\n"
     ]
    }
   ],
   "source": [
    "def average_clustering_coefficient(G):\n",
    "  # TODO: Implement this function that takes a nx.Graph\n",
    "  # and returns the average clustering coefficient. Round \n",
    "  # the result to 2 decimal places (for example 3.333 will\n",
    "  # be rounded to 3.33 and 3.7571 will be rounded to 3.76)\n",
    "\n",
    "  avg_cluster_coef = 0\n",
    "\n",
    "  ############# Your code here ############\n",
    "  ## Note: \n",
    "  ## 1: Please use the appropriate NetworkX clustering function\n",
    "  avg_cluster_coef=round(nx.average_clustering(G),2)\n",
    "  \n",
    "  #########################################\n",
    "\n",
    "  return avg_cluster_coef\n",
    "\n",
    "avg_cluster_coef = average_clustering_coefficient(G)\n",
    "print(\"Average clustering coefficient of karate club network is {}\".format(avg_cluster_coef))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zghQ-AhXYmP4"
   },
   "source": [
    "## Question 3: What is the PageRank value for node 0 (node with id 0) after one PageRank iteration? (5 Points)\n",
    "\n",
    "Please complete the code block by implementing the PageRank equation: $r_j = \\sum_{i \\rightarrow j} \\beta \\frac{r_i}{d_i} + (1 - \\beta) \\frac{1}{N}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "metadata": {
    "id": "BOGdWjNc6O7x"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The PageRank value for node 0 after one iteration is 0.13\n"
     ]
    }
   ],
   "source": [
    "def one_iter_pagerank(G, beta, r0, node_id):\n",
    "  # TODO: Implement this function that takes a nx.Graph, beta, r0 and node id.\n",
    "  # The return value r1 is one interation PageRank value for the input node.\n",
    "  # Please round r1 to 2 decimal places.\n",
    "\n",
    "  r1 = 0\n",
    "\n",
    "  ############# Your code here ############\n",
    "  ## Note: \n",
    "  ## 1: You should not use nx.pagerank\n",
    "  #得到node0的邻居→得到这些邻居的出度（是无向图，所以就是度数）→计算得到右式中的第一项（\\sum{i→j}\\beta\\frac{r_i}{d_i}）→计算得到r_j\n",
    "  for ni in nx.neighbors(G,node_id):\n",
    "    #得到的每一个ni都是node0邻居的索引\n",
    "    #参考：https://networkx.org/documentation/stable/reference/generated/networkx.classes.function.neighbors.html\n",
    "    #另一种获取节点邻居的方式是访问邻接矩阵，参考该博文notes部分：https://www.neusncp.com/user/blog?id=38\n",
    "    di=G.degree[ni]  #获取node_ni的度数\n",
    "    r1+=beta*r0/di\n",
    "  r1+=(1-beta)*(1/G.number_of_nodes())\n",
    "  r1=round(r1,2)\n",
    "\n",
    "  #########################################\n",
    "\n",
    "  return r1\n",
    "\n",
    "beta = 0.8\n",
    "r0 = 1 / G.number_of_nodes()\n",
    "node = 0\n",
    "r1 = one_iter_pagerank(G, beta, r0, node)\n",
    "print(\"The PageRank value for node 0 after one iteration is {}\".format(r1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "icTcOULeYmIu"
   },
   "source": [
    "## Question 4: What is the (raw) closeness centrality for the karate club network node 5? (5 Points)\n",
    "\n",
    "The equation for closeness centrality is $c(v) = \\frac{1}{\\sum_{u \\neq v}\\text{shortest path length between } u \\text{ and } v}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0: 0, 1: 1, 2: 2, 3: 3, 4: 4}\n",
      "0\n",
      "<class 'int'>\n",
      "1\n",
      "<class 'int'>\n",
      "2\n",
      "<class 'int'>\n",
      "3\n",
      "<class 'int'>\n",
      "4\n",
      "<class 'int'>\n"
     ]
    }
   ],
   "source": [
    "#尝试一下计算最短路径长度的函数\n",
    "G1 = nx.path_graph(5)  #生成一条线\n",
    "print(nx.shortest_path_length(G1, source=0))\n",
    "for pair in nx.shortest_path_length(G1, source=0):\n",
    "    print(pair)\n",
    "    print(type(pair))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "id": "XbCsq_tl-3ok"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The karate club network has closeness centrality 0.01\n"
     ]
    }
   ],
   "source": [
    "#PRW解法1\n",
    "def closeness_centrality(G, node=5):\n",
    "  # TODO: Implement the function that calculates closeness centrality \n",
    "  # for a node in karate club network. G is the input karate club \n",
    "  # network and node is the node id in the graph. Please round the \n",
    "  # closeness centrality result to 2 decimal places.\n",
    "\n",
    "  closeness = 0\n",
    "\n",
    "  ## Note:\n",
    "  ## 1: You can use networkx closeness centrality function.\n",
    "  ## 2: Notice that networkx closeness centrality returns the normalized \n",
    "  ## closeness directly, which is different from the raw (unnormalized) \n",
    "  ## one that we learned in the lecture.\n",
    "    \n",
    "  #https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.centrality.closeness_centrality.html\n",
    "\n",
    "  #计算node与所有其他节点之间的最短路径→计算得到结果\n",
    "  node_length_pairs=nx.shortest_path_length(G,source=node)\n",
    "  #函数文档：https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.shortest_paths.generic.shortest_path_length.html\n",
    "  denominator=0\n",
    "  for i in range(G.number_of_nodes()):\n",
    "    #遍历node外的其他节点的索引\n",
    "    if i!=node:\n",
    "      denominator+=node_length_pairs[i]\n",
    "  closeness=round(1/denominator,2)\n",
    "\n",
    "  #########################################\n",
    "\n",
    "  return closeness\n",
    "\n",
    "node = 5\n",
    "closeness = closeness_centrality(G, node=node)\n",
    "print(\"The karate club network has closeness centrality {}\".format(closeness))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The karate club network has closeness centrality 0.01\n"
     ]
    }
   ],
   "source": [
    "#PRW解法2\n",
    "def closeness_centrality(G, node=5):\n",
    "  # TODO: Implement the function that calculates closeness centrality \n",
    "  # for a node in karate club network. G is the input karate club \n",
    "  # network and node is the node id in the graph. Please round the \n",
    "  # closeness centrality result to 2 decimal places.\n",
    "\n",
    "  closeness = 0\n",
    "\n",
    "  ## Note:\n",
    "  ## 1: You can use networkx closeness centrality function.\n",
    "  ## 2: Notice that networkx closeness centrality returns the normalized \n",
    "  ## closeness directly, which is different from the raw (unnormalized) \n",
    "  ## one that we learned in the lecture.\n",
    "    \n",
    "  #https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.centrality.closeness_centrality.html\n",
    "\n",
    "  closeness=nx.closeness_centrality(G,u=node)\n",
    "  closeness=closeness/(G.number_of_nodes()-1)\n",
    "  closeness=round(closeness,2)\n",
    "\n",
    "  #########################################\n",
    "\n",
    "  return closeness\n",
    "\n",
    "node = 5\n",
    "closeness = closeness_centrality(G, node=node)\n",
    "print(\"The karate club network has closeness centrality {}\".format(closeness))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "-MxvowibYl4x"
   },
   "source": [
    "# 2 Graph to Tensor\n",
    "We will then work together to transform the graph $G$ into a PyTorch tensor, so that we can perform machine learning over the graph."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "eDA8PosrA-9V"
   },
   "source": [
    "## Setup\n",
    "Check if PyTorch is properly installed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "metadata": {
    "id": "ntuPVat_BAf1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.6.0\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "print(torch.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "fko_2wSKYlun"
   },
   "source": [
    "## PyTorch tensor basics\n",
    "\n",
    "We can generate PyTorch tensor with all zeros, ones or random values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "metadata": {
    "id": "W2ySw3m-A9qF"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[1., 1., 1., 1.],\n",
      "        [1., 1., 1., 1.],\n",
      "        [1., 1., 1., 1.]])\n",
      "tensor([[0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0.]])\n",
      "tensor([[0.2417, 0.9127, 0.7875, 0.6463],\n",
      "        [0.1192, 0.1317, 0.9079, 0.4481],\n",
      "        [0.0022, 0.4382, 0.3800, 0.5075]])\n",
      "torch.Size([3, 4])\n"
     ]
    }
   ],
   "source": [
    "# Generate 3 x 4 tensor with all ones\n",
    "ones = torch.ones(3, 4)\n",
    "print(ones)\n",
    "\n",
    "# Generate 3 x 4 tensor with all zeros\n",
    "zeros = torch.zeros(3, 4)\n",
    "print(zeros)\n",
    "\n",
    "# Generate 3 x 4 tensor with random values on the interval [0, 1)\n",
    "random_tensor = torch.rand(3, 4)\n",
    "print(random_tensor)\n",
    "\n",
    "# Get the shape of the tensor\n",
    "print(ones.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "x8mp66eHBxWC"
   },
   "source": [
    "PyTorch tensor contains elements for a single data type, the `dtype`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "metadata": {
    "id": "rQiOvKJJBwq4"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.float32\n",
      "torch.int64\n"
     ]
    }
   ],
   "source": [
    "# Create a 3 x 4 tensor with all 32-bit floating point zeros\n",
    "zeros = torch.zeros(3, 4, dtype=torch.float32)\n",
    "print(zeros.dtype)\n",
    "\n",
    "# Change the tensor dtype to 64-bit integer\n",
    "zeros = zeros.type(torch.long)\n",
    "print(zeros.dtype)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "I9EfegIRDkk2"
   },
   "source": [
    "## Question 5: Getting the edge list of the karate club network and transform it into `torch.LongTensor`. What is the `torch.sum` value of `pos_edge_index` tensor? (10 Points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "metadata": {
    "id": "kEtVxMFID3ZT"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The pos_edge_index tensor has shape torch.Size([2, 78])\n",
      "The pos_edge_index tensor has sum value 2535\n"
     ]
    }
   ],
   "source": [
    "def graph_to_edge_list(G):\n",
    "  # TODO: Implement the function that returns the edge list of\n",
    "  # an nx.Graph. The returned edge_list should be a list of tuples\n",
    "  # where each tuple is a tuple representing an edge connected \n",
    "  # by two nodes.\n",
    "\n",
    "  edge_list = []\n",
    "\n",
    "  ############# Your code here ############\n",
    "  for edge in G.edges():\n",
    "    edge_list.append(edge)\n",
    "  #########################################\n",
    "\n",
    "  return edge_list\n",
    "\n",
    "def edge_list_to_tensor(edge_list):\n",
    "  # TODO: Implement the function that transforms the edge_list to\n",
    "  # tensor. The input edge_list is a list of tuples and the resulting\n",
    "  # tensor should have the shape [2 x len(edge_list)].\n",
    "\n",
    "  edge_index = torch.tensor([])\n",
    "\n",
    "  ############# Your code here ############\n",
    "  edge_index=torch.LongTensor(edge_list).t()\n",
    "  #########################################\n",
    "\n",
    "  return edge_index\n",
    "\n",
    "pos_edge_list = graph_to_edge_list(G)\n",
    "pos_edge_index = edge_list_to_tensor(pos_edge_list)\n",
    "print(\"The pos_edge_index tensor has shape {}\".format(pos_edge_index.shape))\n",
    "print(\"The pos_edge_index tensor has sum value {}\".format(torch.sum(pos_edge_index)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]"
      ]
     },
     "execution_count": 217,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pos_edge_list[:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "UBL-ZmdHWqIu"
   },
   "source": [
    "## Question 6: Please implement following function that samples negative edges. Then you will answer which edges (edge_1 to edge_5) can be negative ones in the karate club network? (10 Points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "{}\n"
     ]
    }
   ],
   "source": [
    "#我一开始就没搞懂这个negative edge是什么，怀疑指的是边权重为负，所以测试计算graph边权重的函数\n",
    "print(G.has_edge(0,1))\n",
    "print(G.get_edge_data(0,1))\n",
    "#所以说图中的边……没有带数据，所以不是指weight为负\n",
    "#我看了一下知识图谱那节课的slides，以及参考别人写的notebook代码，认为应该是指获取不在图中训练集里的边"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 219,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G.has_edge(1,0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {},
   "outputs": [],
   "source": [
    "#测试计算图中不存在的边的函数\n",
    "for nd in nx.non_edges(G):\n",
    "    #print(nd)我从中看出，没有自环，而且只有一个方向（应该是因为是无向图）\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "(0, 32)\n"
     ]
    }
   ],
   "source": [
    "#测试如何通过索引获取non_edges函数返回值中的元素\n",
    "for i,e in enumerate(nx.non_edges(G)):\n",
    "    print(i)\n",
    "    print(e)\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, (0, 33))"
      ]
     },
     "execution_count": 222,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(enumerate(nx.non_edges(G)))[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "483"
      ]
     },
     "execution_count": 223,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(list(enumerate(nx.non_edges(G))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {
    "id": "9N8VT1f8-IJ8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The neg_edge_index tensor has shape torch.Size([2, 78])\n",
      "edge_1 can't be negative edge\n",
      "edge_2 can be negative edge\n",
      "edge_3 can't be negative edge\n",
      "edge_4 can't be negative edge\n",
      "edge_5 can be negative edge\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "def sample_negative_edges(G, num_neg_samples):\n",
    "  # TODO: Implement the function that returns a list of negative edges.\n",
    "  # The number of sampled negative edges is num_neg_samples. You do not\n",
    "  # need to consider the corner case when the number of possible negative edges\n",
    "  # is less than num_neg_samples. It should be ok as long as your implementation \n",
    "  # works on the karate club network. In this implementation, self loop should \n",
    "  # not be considered as either a positive or negative edge. Also, notice that \n",
    "  # the karate club network is an undirected graph, if (0, 1) is a positive \n",
    "  # edge, do you think (1, 0) can be a negative one?\n",
    "\n",
    "  neg_edge_list = []\n",
    "\n",
    "  ############# Your code here ############\n",
    "  #得到图中所有不存在的边，不考虑自环。注意对于逆边问题，我认为在代码编写过程中应该可以不考虑（毕竟是无向图）。\n",
    "  #不考虑num_neg_sample过大的边界条件\n",
    "  #我的抽取逻辑是按照non_edges_one_side的索引来抽取边\n",
    "  non_edges_one_side=list(enumerate(nx.non_edges(G)))\n",
    "  neg_edge_list_indices=random.sample(range(0,len(non_edges_one_side)),num_neg_samples)  #取样num_neg_samples长度的索引\n",
    "  for i in neg_edge_list_indices:\n",
    "    neg_edge_list.append(non_edges_one_side[i][1])\n",
    "  #########################################\n",
    "\n",
    "  return neg_edge_list\n",
    "\n",
    "# Sample 78 negative edges\n",
    "neg_edge_list = sample_negative_edges(G, len(pos_edge_list))\n",
    "\n",
    "# Transform the negative edge list to tensor\n",
    "neg_edge_index = edge_list_to_tensor(neg_edge_list)\n",
    "print(\"The neg_edge_index tensor has shape {}\".format(neg_edge_index.shape))\n",
    "\n",
    "# Which of following edges can be negative ones?\n",
    "edge_1 = (7, 1)\n",
    "edge_2 = (1, 33)\n",
    "edge_3 = (33, 22)\n",
    "edge_4 = (0, 4)\n",
    "edge_5 = (4, 2)\n",
    "\n",
    "############# Your code here ############\n",
    "## Note:\n",
    "## 1: For each of the 5 edges, print whether it can be negative edge\n",
    "#如果边在图中，就认为不行\n",
    "print('edge_1'+(\" can't\" if G.has_edge(edge_1[0],edge_1[1]) else ' can')+' be negative edge')\n",
    "print('edge_2'+(\" can't\" if G.has_edge(edge_2[0],edge_2[1]) else ' can')+' be negative edge')\n",
    "print('edge_3'+(\" can't\" if G.has_edge(edge_3[0],edge_3[1]) else ' can')+' be negative edge')\n",
    "print('edge_4'+(\" can't\" if G.has_edge(edge_4[0],edge_4[1]) else ' can')+' be negative edge')\n",
    "print('edge_5'+(\" can't\" if G.has_edge(edge_5[0],edge_5[1]) else ' can')+' be negative edge')\n",
    "#########################################"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Wk9Q-a-9qGsw"
   },
   "source": [
    "# 3 Node Emebedding Learning\n",
    "\n",
    "Finally, we will finish the first learning algorithm on graphs: a node embedding model.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#PRW：看了一下解释，感觉embedding函数就像个大矩阵，每一行直接对应到对应索引的词的嵌入结果（相当于Encoder-Decoder模型里面的一列）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NDBxRQcZ_dUH"
   },
   "source": [
    "## Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {
    "id": "Lnqn9H6s_ehX"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.6.0\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "\n",
    "print(torch.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "6gomAf8vxq0R"
   },
   "source": [
    "To write our own node embedding learning methods, we'll heavily use the [`nn.Embedding`](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html) module in PyTorch. Let's see how to use `nn.Embedding`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {
    "id": "aRiWGuLAx5yx"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sample embedding layer: Embedding(4, 8)\n"
     ]
    }
   ],
   "source": [
    "# Initialize an embedding layer\n",
    "# Suppose we want to have embedding for 4 items (e.g., nodes)\n",
    "# Each item is represented with 8 dimensional vector\n",
    "\n",
    "emb_sample = nn.Embedding(num_embeddings=4, embedding_dim=8)\n",
    "print('Sample embedding layer: {}'.format(emb_sample))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Parameter containing:\n",
       "tensor([[ 1.5082e+00, -4.2434e-02,  4.9979e-01, -8.1991e-01,  4.2095e-01,\n",
       "         -1.7431e+00, -1.6584e+00,  1.7252e+00],\n",
       "        [-4.4258e-01, -1.5349e+00,  1.1118e-03, -8.3201e-01,  6.3567e-01,\n",
       "         -7.7746e-01, -5.5710e-02, -4.4338e-02],\n",
       "        [-3.6606e-01, -1.1230e-01,  1.4006e-01, -1.0772e+00,  1.1557e+00,\n",
       "         -1.0234e+00,  9.1988e-01,  1.3019e+00],\n",
       "        [ 4.5921e-01,  8.7926e-02,  9.4428e-01, -7.5985e-01,  1.6396e+00,\n",
       "         -1.9154e+00, -1.8657e+00, -6.7076e-01]], requires_grad=True)"
      ]
     },
     "execution_count": 227,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "emb_sample.weight"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bS9qQfeujEVh"
   },
   "source": [
    "We can select items from the embedding matrix, by using Tensor indices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {
    "id": "9AGIfP4QEDr8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[-4.4258e-01, -1.5349e+00,  1.1118e-03, -8.3201e-01,  6.3567e-01,\n",
      "         -7.7746e-01, -5.5710e-02, -4.4338e-02]], grad_fn=<EmbeddingBackward>)\n",
      "tensor([[-4.4258e-01, -1.5349e+00,  1.1118e-03, -8.3201e-01,  6.3567e-01,\n",
      "         -7.7746e-01, -5.5710e-02, -4.4338e-02],\n",
      "        [ 4.5921e-01,  8.7926e-02,  9.4428e-01, -7.5985e-01,  1.6396e+00,\n",
      "         -1.9154e+00, -1.8657e+00, -6.7076e-01]], grad_fn=<EmbeddingBackward>)\n",
      "torch.Size([4, 8])\n",
      "tensor([[1., 1., 1., 1., 1., 1., 1., 1.],\n",
      "        [1., 1., 1., 1., 1., 1., 1., 1.]], grad_fn=<EmbeddingBackward>)\n"
     ]
    }
   ],
   "source": [
    "# Select an embedding in emb_sample\n",
    "id = torch.LongTensor([1])\n",
    "print(emb_sample(id))\n",
    "\n",
    "# Select multiple embeddings\n",
    "ids = torch.LongTensor([1, 3])\n",
    "print(emb_sample(ids))\n",
    "\n",
    "# Get the shape of the embedding weight matrix\n",
    "shape = emb_sample.weight.data.shape\n",
    "print(shape)\n",
    "\n",
    "# Overwrite the weight to tensor with all ones\n",
    "emb_sample.weight.data = torch.ones(shape)\n",
    "\n",
    "# Let's check if the emb is indeed initilized\n",
    "ids = torch.LongTensor([0, 3])\n",
    "print(emb_sample(ids))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8MjBuDKaKIsM"
   },
   "source": [
    "Now, it's your time to create node embedding matrix for the graph we have!\n",
    "- We want to have **16 dimensional** vector for each node in the karate club network.\n",
    "- We want to initalize the matrix under **uniform distribution**, in the range of $[0, 1)$. We suggest you using [`torch.rand`](https://pytorch.org/docs/stable/generated/torch.rand.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {
    "id": "hMszSwRPKGn1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Embedding: Embedding(34, 16)\n",
      "tensor([[0.2114, 0.7335, 0.1433, 0.9647, 0.2933, 0.7951, 0.5170, 0.2801, 0.8339,\n",
      "         0.1185, 0.2355, 0.5599, 0.8966, 0.2858, 0.1955, 0.1808],\n",
      "        [0.7486, 0.6546, 0.3843, 0.9820, 0.6012, 0.3710, 0.4929, 0.9915, 0.8358,\n",
      "         0.4629, 0.9902, 0.7196, 0.2338, 0.0450, 0.7906, 0.9689]],\n",
      "       grad_fn=<EmbeddingBackward>)\n"
     ]
    }
   ],
   "source": [
    "# Please do not change / reset the random seed\n",
    "torch.manual_seed(1)\n",
    "\n",
    "def create_node_emb(num_node=34, embedding_dim=16):\n",
    "  # TODO: Implement this function that will create the node embedding matrix.\n",
    "  # A torch.nn.Embedding layer will be returned. You do not need to change \n",
    "  # the values of num_node and embedding_dim. The weight matrix of returned \n",
    "  # layer should be initialized under uniform distribution. \n",
    "\n",
    "  emb = None\n",
    "\n",
    "  ############# Your code here ############\n",
    "  emb=nn.Embedding(num_node,embedding_dim)\n",
    "  emb.weight.data=torch.rand(num_node,embedding_dim)\n",
    "  #########################################\n",
    "\n",
    "  return emb\n",
    "\n",
    "emb = create_node_emb()\n",
    "ids = torch.LongTensor([0, 3])\n",
    "\n",
    "# Print the embedding layer\n",
    "print(\"Embedding: {}\".format(emb))\n",
    "\n",
    "# An example that gets the embeddings for node 0 and 3\n",
    "print(emb(ids))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4QfoANibTzyh"
   },
   "source": [
    "## Visualize the initial node embeddings\n",
    "One good way to understand an embedding matrix, is to visualize it in a 2D space.\n",
    "Here, we have implemented an embedding visualization function for you.\n",
    "We first do PCA to reduce the dimensionality of embeddings to a 2D space.\n",
    "Then visualize each point, colored by the community it belongs to."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {
    "id": "_LCoIkarhfYD"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n",
       "<svg height=\"357.238125pt\" version=\"1.1\" viewBox=\"0 0 380.482813 357.238125\" width=\"380.482813pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
       " <defs>\r\n",
       "  <style type=\"text/css\">\r\n",
       "*{stroke-linecap:butt;stroke-linejoin:round;}\r\n",
       "  </style>\r\n",
       " </defs>\r\n",
       " <g id=\"figure_1\">\r\n",
       "  <g id=\"patch_1\">\r\n",
       "   <path d=\"M -0 357.238125 \r\n",
       "L 380.482813 357.238125 \r\n",
       "L 380.482813 0 \r\n",
       "L -0 0 \r\n",
       "z\r\n",
       "\" style=\"fill:none;\"/>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_1\">\r\n",
       "   <g id=\"patch_2\">\r\n",
       "    <path d=\"M 38.482813 333.36 \r\n",
       "L 373.282813 333.36 \r\n",
       "L 373.282813 7.2 \r\n",
       "L 38.482813 7.2 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"PathCollection_1\">\r\n",
       "    <defs>\r\n",
       "     <path d=\"M 0 3 \r\n",
       "C 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\n",
       "C 2.683901 1.55874 3 0.795609 3 0 \r\n",
       "C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\n",
       "C 1.55874 -2.683901 0.795609 -3 0 -3 \r\n",
       "C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\n",
       "C -2.683901 -1.55874 -3 -0.795609 -3 0 \r\n",
       "C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\n",
       "C -1.55874 2.683901 -0.795609 3 0 3 \r\n",
       "z\r\n",
       "\" id=\"mabcaab7e04\" style=\"stroke:#ff0000;\"/>\r\n",
       "    </defs>\r\n",
       "    <g clip-path=\"url(#pd03a50d579)\">\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"225.600407\" xlink:href=\"#mabcaab7e04\" y=\"72.525031\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"267.713244\" xlink:href=\"#mabcaab7e04\" y=\"254.604859\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"111.164603\" xlink:href=\"#mabcaab7e04\" y=\"244.634227\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"125.164689\" xlink:href=\"#mabcaab7e04\" y=\"202.013359\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"235.931855\" xlink:href=\"#mabcaab7e04\" y=\"196.374431\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"186.193697\" xlink:href=\"#mabcaab7e04\" y=\"41.463771\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"55.282385\" xlink:href=\"#mabcaab7e04\" y=\"237.281447\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"305.813691\" xlink:href=\"#mabcaab7e04\" y=\"56.7576\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"223.564584\" xlink:href=\"#mabcaab7e04\" y=\"111.303848\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"110.472943\" xlink:href=\"#mabcaab7e04\" y=\"215.55923\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"236.771005\" xlink:href=\"#mabcaab7e04\" y=\"220.909739\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"158.59617\" xlink:href=\"#mabcaab7e04\" y=\"256.296984\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"125.505022\" xlink:href=\"#mabcaab7e04\" y=\"204.551809\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"68.474653\" xlink:href=\"#mabcaab7e04\" y=\"77.622038\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"116.944871\" xlink:href=\"#mabcaab7e04\" y=\"146.500117\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"162.447954\" xlink:href=\"#mabcaab7e04\" y=\"58.503107\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"131.169337\" xlink:href=\"#mabcaab7e04\" y=\"299.867314\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"PathCollection_2\">\r\n",
       "    <defs>\r\n",
       "     <path d=\"M 0 3 \r\n",
       "C 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\n",
       "C 2.683901 1.55874 3 0.795609 3 0 \r\n",
       "C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\n",
       "C 1.55874 -2.683901 0.795609 -3 0 -3 \r\n",
       "C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\n",
       "C -2.683901 -1.55874 -3 -0.795609 -3 0 \r\n",
       "C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\n",
       "C -1.55874 2.683901 -0.795609 3 0 3 \r\n",
       "z\r\n",
       "\" id=\"m15e421741f\" style=\"stroke:#0000ff;\"/>\r\n",
       "    </defs>\r\n",
       "    <g clip-path=\"url(#pd03a50d579)\">\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"277.690486\" xlink:href=\"#m15e421741f\" y=\"260.074122\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"222.694339\" xlink:href=\"#m15e421741f\" y=\"24.675834\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"289.667585\" xlink:href=\"#m15e421741f\" y=\"315.884166\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"98.78364\" xlink:href=\"#m15e421741f\" y=\"302.786394\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"265.301324\" xlink:href=\"#m15e421741f\" y=\"192.514107\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"250.657857\" xlink:href=\"#m15e421741f\" y=\"70.904349\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"97.408679\" xlink:href=\"#m15e421741f\" y=\"144.792485\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"205.049767\" xlink:href=\"#m15e421741f\" y=\"166.410455\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"197.115689\" xlink:href=\"#m15e421741f\" y=\"101.424693\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"304.421798\" xlink:href=\"#m15e421741f\" y=\"285.145765\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"79.471991\" xlink:href=\"#m15e421741f\" y=\"191.354773\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"64.722763\" xlink:href=\"#m15e421741f\" y=\"186.999281\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"116.414592\" xlink:href=\"#m15e421741f\" y=\"222.552347\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"277.955108\" xlink:href=\"#m15e421741f\" y=\"170.046277\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"149.71711\" xlink:href=\"#m15e421741f\" y=\"62.559846\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"89.456886\" xlink:href=\"#m15e421741f\" y=\"170.318059\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"355.564062\" xlink:href=\"#m15e421741f\" y=\"237.429792\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_1\">\r\n",
       "    <g id=\"xtick_1\">\r\n",
       "     <g id=\"line2d_1\">\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 0 0 \r\n",
       "L 0 3.5 \r\n",
       "\" id=\"m0478223f89\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
       "      </defs>\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"49.664218\" xlink:href=\"#m0478223f89\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_1\">\r\n",
       "      <!-- −0.75 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 10.59375 35.5 \r\n",
       "L 73.1875 35.5 \r\n",
       "L 73.1875 27.203125 \r\n",
       "L 10.59375 27.203125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-8722\"/>\r\n",
       "       <path d=\"M 31.78125 66.40625 \r\n",
       "Q 24.171875 66.40625 20.328125 58.90625 \r\n",
       "Q 16.5 51.421875 16.5 36.375 \r\n",
       "Q 16.5 21.390625 20.328125 13.890625 \r\n",
       "Q 24.171875 6.390625 31.78125 6.390625 \r\n",
       "Q 39.453125 6.390625 43.28125 13.890625 \r\n",
       "Q 47.125 21.390625 47.125 36.375 \r\n",
       "Q 47.125 51.421875 43.28125 58.90625 \r\n",
       "Q 39.453125 66.40625 31.78125 66.40625 \r\n",
       "z\r\n",
       "M 31.78125 74.21875 \r\n",
       "Q 44.046875 74.21875 50.515625 64.515625 \r\n",
       "Q 56.984375 54.828125 56.984375 36.375 \r\n",
       "Q 56.984375 17.96875 50.515625 8.265625 \r\n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \r\n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \r\n",
       "Q 6.59375 17.96875 6.59375 36.375 \r\n",
       "Q 6.59375 54.828125 13.0625 64.515625 \r\n",
       "Q 19.53125 74.21875 31.78125 74.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-48\"/>\r\n",
       "       <path d=\"M 10.6875 12.40625 \r\n",
       "L 21 12.40625 \r\n",
       "L 21 0 \r\n",
       "L 10.6875 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-46\"/>\r\n",
       "       <path d=\"M 8.203125 72.90625 \r\n",
       "L 55.078125 72.90625 \r\n",
       "L 55.078125 68.703125 \r\n",
       "L 28.609375 0 \r\n",
       "L 18.3125 0 \r\n",
       "L 43.21875 64.59375 \r\n",
       "L 8.203125 64.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-55\"/>\r\n",
       "       <path d=\"M 10.796875 72.90625 \r\n",
       "L 49.515625 72.90625 \r\n",
       "L 49.515625 64.59375 \r\n",
       "L 19.828125 64.59375 \r\n",
       "L 19.828125 46.734375 \r\n",
       "Q 21.96875 47.46875 24.109375 47.828125 \r\n",
       "Q 26.265625 48.1875 28.421875 48.1875 \r\n",
       "Q 40.625 48.1875 47.75 41.5 \r\n",
       "Q 54.890625 34.8125 54.890625 23.390625 \r\n",
       "Q 54.890625 11.625 47.5625 5.09375 \r\n",
       "Q 40.234375 -1.421875 26.90625 -1.421875 \r\n",
       "Q 22.3125 -1.421875 17.546875 -0.640625 \r\n",
       "Q 12.796875 0.140625 7.71875 1.703125 \r\n",
       "L 7.71875 11.625 \r\n",
       "Q 12.109375 9.234375 16.796875 8.0625 \r\n",
       "Q 21.484375 6.890625 26.703125 6.890625 \r\n",
       "Q 35.15625 6.890625 40.078125 11.328125 \r\n",
       "Q 45.015625 15.765625 45.015625 23.390625 \r\n",
       "Q 45.015625 31 40.078125 35.4375 \r\n",
       "Q 35.15625 39.890625 26.703125 39.890625 \r\n",
       "Q 22.75 39.890625 18.8125 39.015625 \r\n",
       "Q 14.890625 38.140625 10.796875 36.28125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-53\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(34.341561 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"147.412109\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"179.199219\" xlink:href=\"#DejaVuSans-55\"/>\r\n",
       "       <use x=\"242.822266\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_2\">\r\n",
       "     <g id=\"line2d_2\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"93.785018\" xlink:href=\"#m0478223f89\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_2\">\r\n",
       "      <!-- −0.50 -->\r\n",
       "      <g transform=\"translate(78.462362 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"147.412109\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"179.199219\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "       <use x=\"242.822266\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_3\">\r\n",
       "     <g id=\"line2d_3\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"137.905819\" xlink:href=\"#m0478223f89\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_3\">\r\n",
       "      <!-- −0.25 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 19.1875 8.296875 \r\n",
       "L 53.609375 8.296875 \r\n",
       "L 53.609375 0 \r\n",
       "L 7.328125 0 \r\n",
       "L 7.328125 8.296875 \r\n",
       "Q 12.9375 14.109375 22.625 23.890625 \r\n",
       "Q 32.328125 33.6875 34.8125 36.53125 \r\n",
       "Q 39.546875 41.84375 41.421875 45.53125 \r\n",
       "Q 43.3125 49.21875 43.3125 52.78125 \r\n",
       "Q 43.3125 58.59375 39.234375 62.25 \r\n",
       "Q 35.15625 65.921875 28.609375 65.921875 \r\n",
       "Q 23.96875 65.921875 18.8125 64.3125 \r\n",
       "Q 13.671875 62.703125 7.8125 59.421875 \r\n",
       "L 7.8125 69.390625 \r\n",
       "Q 13.765625 71.78125 18.9375 73 \r\n",
       "Q 24.125 74.21875 28.421875 74.21875 \r\n",
       "Q 39.75 74.21875 46.484375 68.546875 \r\n",
       "Q 53.21875 62.890625 53.21875 53.421875 \r\n",
       "Q 53.21875 48.921875 51.53125 44.890625 \r\n",
       "Q 49.859375 40.875 45.40625 35.40625 \r\n",
       "Q 44.1875 33.984375 37.640625 27.21875 \r\n",
       "Q 31.109375 20.453125 19.1875 8.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-50\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(122.583163 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"147.412109\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"179.199219\" xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "       <use x=\"242.822266\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_4\">\r\n",
       "     <g id=\"line2d_4\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"182.026619\" xlink:href=\"#m0478223f89\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_4\">\r\n",
       "      <!-- 0.00 -->\r\n",
       "      <g transform=\"translate(170.893807 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_5\">\r\n",
       "     <g id=\"line2d_5\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"226.14742\" xlink:href=\"#m0478223f89\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_5\">\r\n",
       "      <!-- 0.25 -->\r\n",
       "      <g transform=\"translate(215.014607 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_6\">\r\n",
       "     <g id=\"line2d_6\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"270.26822\" xlink:href=\"#m0478223f89\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_6\">\r\n",
       "      <!-- 0.50 -->\r\n",
       "      <g transform=\"translate(259.135408 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_7\">\r\n",
       "     <g id=\"line2d_7\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"314.389021\" xlink:href=\"#m0478223f89\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_7\">\r\n",
       "      <!-- 0.75 -->\r\n",
       "      <g transform=\"translate(303.256209 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-55\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-53\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_8\">\r\n",
       "     <g id=\"line2d_8\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"358.509822\" xlink:href=\"#m0478223f89\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_8\">\r\n",
       "      <!-- 1.00 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 12.40625 8.296875 \r\n",
       "L 28.515625 8.296875 \r\n",
       "L 28.515625 63.921875 \r\n",
       "L 10.984375 60.40625 \r\n",
       "L 10.984375 69.390625 \r\n",
       "L 28.421875 72.90625 \r\n",
       "L 38.28125 72.90625 \r\n",
       "L 38.28125 8.296875 \r\n",
       "L 54.390625 8.296875 \r\n",
       "L 54.390625 0 \r\n",
       "L 12.40625 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-49\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(347.377009 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-49\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_2\">\r\n",
       "    <g id=\"ytick_1\">\r\n",
       "     <g id=\"line2d_9\">\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 0 0 \r\n",
       "L -3.5 0 \r\n",
       "\" id=\"m89b8d93299\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
       "      </defs>\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"330.946758\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_9\">\r\n",
       "      <!-- −0.8 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 31.78125 34.625 \r\n",
       "Q 24.75 34.625 20.71875 30.859375 \r\n",
       "Q 16.703125 27.09375 16.703125 20.515625 \r\n",
       "Q 16.703125 13.921875 20.71875 10.15625 \r\n",
       "Q 24.75 6.390625 31.78125 6.390625 \r\n",
       "Q 38.8125 6.390625 42.859375 10.171875 \r\n",
       "Q 46.921875 13.96875 46.921875 20.515625 \r\n",
       "Q 46.921875 27.09375 42.890625 30.859375 \r\n",
       "Q 38.875 34.625 31.78125 34.625 \r\n",
       "z\r\n",
       "M 21.921875 38.8125 \r\n",
       "Q 15.578125 40.375 12.03125 44.71875 \r\n",
       "Q 8.5 49.078125 8.5 55.328125 \r\n",
       "Q 8.5 64.0625 14.71875 69.140625 \r\n",
       "Q 20.953125 74.21875 31.78125 74.21875 \r\n",
       "Q 42.671875 74.21875 48.875 69.140625 \r\n",
       "Q 55.078125 64.0625 55.078125 55.328125 \r\n",
       "Q 55.078125 49.078125 51.53125 44.71875 \r\n",
       "Q 48 40.375 41.703125 38.8125 \r\n",
       "Q 48.828125 37.15625 52.796875 32.3125 \r\n",
       "Q 56.78125 27.484375 56.78125 20.515625 \r\n",
       "Q 56.78125 9.90625 50.3125 4.234375 \r\n",
       "Q 43.84375 -1.421875 31.78125 -1.421875 \r\n",
       "Q 19.734375 -1.421875 13.25 4.234375 \r\n",
       "Q 6.78125 9.90625 6.78125 20.515625 \r\n",
       "Q 6.78125 27.484375 10.78125 32.3125 \r\n",
       "Q 14.796875 37.15625 21.921875 38.8125 \r\n",
       "z\r\n",
       "M 18.3125 54.390625 \r\n",
       "Q 18.3125 48.734375 21.84375 45.5625 \r\n",
       "Q 25.390625 42.390625 31.78125 42.390625 \r\n",
       "Q 38.140625 42.390625 41.71875 45.5625 \r\n",
       "Q 45.3125 48.734375 45.3125 54.390625 \r\n",
       "Q 45.3125 60.0625 41.71875 63.234375 \r\n",
       "Q 38.140625 66.40625 31.78125 66.40625 \r\n",
       "Q 25.390625 66.40625 21.84375 63.234375 \r\n",
       "Q 18.3125 60.0625 18.3125 54.390625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-56\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(7.2 334.745977)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"147.412109\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"179.199219\" xlink:href=\"#DejaVuSans-56\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_2\">\r\n",
       "     <g id=\"line2d_10\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"292.347141\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_10\">\r\n",
       "      <!-- −0.6 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 33.015625 40.375 \r\n",
       "Q 26.375 40.375 22.484375 35.828125 \r\n",
       "Q 18.609375 31.296875 18.609375 23.390625 \r\n",
       "Q 18.609375 15.53125 22.484375 10.953125 \r\n",
       "Q 26.375 6.390625 33.015625 6.390625 \r\n",
       "Q 39.65625 6.390625 43.53125 10.953125 \r\n",
       "Q 47.40625 15.53125 47.40625 23.390625 \r\n",
       "Q 47.40625 31.296875 43.53125 35.828125 \r\n",
       "Q 39.65625 40.375 33.015625 40.375 \r\n",
       "z\r\n",
       "M 52.59375 71.296875 \r\n",
       "L 52.59375 62.3125 \r\n",
       "Q 48.875 64.0625 45.09375 64.984375 \r\n",
       "Q 41.3125 65.921875 37.59375 65.921875 \r\n",
       "Q 27.828125 65.921875 22.671875 59.328125 \r\n",
       "Q 17.53125 52.734375 16.796875 39.40625 \r\n",
       "Q 19.671875 43.65625 24.015625 45.921875 \r\n",
       "Q 28.375 48.1875 33.59375 48.1875 \r\n",
       "Q 44.578125 48.1875 50.953125 41.515625 \r\n",
       "Q 57.328125 34.859375 57.328125 23.390625 \r\n",
       "Q 57.328125 12.15625 50.6875 5.359375 \r\n",
       "Q 44.046875 -1.421875 33.015625 -1.421875 \r\n",
       "Q 20.359375 -1.421875 13.671875 8.265625 \r\n",
       "Q 6.984375 17.96875 6.984375 36.375 \r\n",
       "Q 6.984375 53.65625 15.1875 63.9375 \r\n",
       "Q 23.390625 74.21875 37.203125 74.21875 \r\n",
       "Q 40.921875 74.21875 44.703125 73.484375 \r\n",
       "Q 48.484375 72.75 52.59375 71.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-54\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(7.2 296.14636)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"147.412109\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"179.199219\" xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_3\">\r\n",
       "     <g id=\"line2d_11\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"253.747524\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_11\">\r\n",
       "      <!-- −0.4 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 37.796875 64.3125 \r\n",
       "L 12.890625 25.390625 \r\n",
       "L 37.796875 25.390625 \r\n",
       "z\r\n",
       "M 35.203125 72.90625 \r\n",
       "L 47.609375 72.90625 \r\n",
       "L 47.609375 25.390625 \r\n",
       "L 58.015625 25.390625 \r\n",
       "L 58.015625 17.1875 \r\n",
       "L 47.609375 17.1875 \r\n",
       "L 47.609375 0 \r\n",
       "L 37.796875 0 \r\n",
       "L 37.796875 17.1875 \r\n",
       "L 4.890625 17.1875 \r\n",
       "L 4.890625 26.703125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-52\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(7.2 257.546743)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"147.412109\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"179.199219\" xlink:href=\"#DejaVuSans-52\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_4\">\r\n",
       "     <g id=\"line2d_12\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"215.147907\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_12\">\r\n",
       "      <!-- −0.2 -->\r\n",
       "      <g transform=\"translate(7.2 218.947126)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"147.412109\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"179.199219\" xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_5\">\r\n",
       "     <g id=\"line2d_13\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"176.54829\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_13\">\r\n",
       "      <!-- 0.0 -->\r\n",
       "      <g transform=\"translate(15.579688 180.347509)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_6\">\r\n",
       "     <g id=\"line2d_14\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"137.948674\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_14\">\r\n",
       "      <!-- 0.2 -->\r\n",
       "      <g transform=\"translate(15.579688 141.747892)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_7\">\r\n",
       "     <g id=\"line2d_15\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"99.349057\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_15\">\r\n",
       "      <!-- 0.4 -->\r\n",
       "      <g transform=\"translate(15.579688 103.148275)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_8\">\r\n",
       "     <g id=\"line2d_16\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"60.74944\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_16\">\r\n",
       "      <!-- 0.6 -->\r\n",
       "      <g transform=\"translate(15.579688 64.548658)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_9\">\r\n",
       "     <g id=\"line2d_17\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"38.482813\" xlink:href=\"#m89b8d93299\" y=\"22.149823\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_17\">\r\n",
       "      <!-- 0.8 -->\r\n",
       "      <g transform=\"translate(15.579688 25.949041)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_3\">\r\n",
       "    <path d=\"M 38.482813 333.36 \r\n",
       "L 38.482813 7.2 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_4\">\r\n",
       "    <path d=\"M 373.282813 333.36 \r\n",
       "L 373.282813 7.2 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_5\">\r\n",
       "    <path d=\"M 38.482812 333.36 \r\n",
       "L 373.282813 333.36 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_6\">\r\n",
       "    <path d=\"M 38.482812 7.2 \r\n",
       "L 373.282813 7.2 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"legend_1\">\r\n",
       "    <g id=\"patch_7\">\r\n",
       "     <path d=\"M 300.829688 44.55625 \r\n",
       "L 366.282813 44.55625 \r\n",
       "Q 368.282813 44.55625 368.282813 42.55625 \r\n",
       "L 368.282813 14.2 \r\n",
       "Q 368.282813 12.2 366.282813 12.2 \r\n",
       "L 300.829688 12.2 \r\n",
       "Q 298.829688 12.2 298.829688 14.2 \r\n",
       "L 298.829688 42.55625 \r\n",
       "Q 298.829688 44.55625 300.829688 44.55625 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\r\n",
       "    </g>\r\n",
       "    <g id=\"PathCollection_3\">\r\n",
       "     <g>\r\n",
       "      <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"312.829688\" xlink:href=\"#mabcaab7e04\" y=\"21.173437\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_18\">\r\n",
       "     <!-- Mr. Hi -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 9.8125 72.90625 \r\n",
       "L 24.515625 72.90625 \r\n",
       "L 43.109375 23.296875 \r\n",
       "L 61.8125 72.90625 \r\n",
       "L 76.515625 72.90625 \r\n",
       "L 76.515625 0 \r\n",
       "L 66.890625 0 \r\n",
       "L 66.890625 64.015625 \r\n",
       "L 48.09375 14.015625 \r\n",
       "L 38.1875 14.015625 \r\n",
       "L 19.390625 64.015625 \r\n",
       "L 19.390625 0 \r\n",
       "L 9.8125 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-77\"/>\r\n",
       "      <path d=\"M 41.109375 46.296875 \r\n",
       "Q 39.59375 47.171875 37.8125 47.578125 \r\n",
       "Q 36.03125 48 33.890625 48 \r\n",
       "Q 26.265625 48 22.1875 43.046875 \r\n",
       "Q 18.109375 38.09375 18.109375 28.8125 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 54.6875 \r\n",
       "L 18.109375 54.6875 \r\n",
       "L 18.109375 46.1875 \r\n",
       "Q 20.953125 51.171875 25.484375 53.578125 \r\n",
       "Q 30.03125 56 36.53125 56 \r\n",
       "Q 37.453125 56 38.578125 55.875 \r\n",
       "Q 39.703125 55.765625 41.0625 55.515625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-114\"/>\r\n",
       "      <path id=\"DejaVuSans-32\"/>\r\n",
       "      <path d=\"M 9.8125 72.90625 \r\n",
       "L 19.671875 72.90625 \r\n",
       "L 19.671875 43.015625 \r\n",
       "L 55.515625 43.015625 \r\n",
       "L 55.515625 72.90625 \r\n",
       "L 65.375 72.90625 \r\n",
       "L 65.375 0 \r\n",
       "L 55.515625 0 \r\n",
       "L 55.515625 34.71875 \r\n",
       "L 19.671875 34.71875 \r\n",
       "L 19.671875 0 \r\n",
       "L 9.8125 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-72\"/>\r\n",
       "      <path d=\"M 9.421875 54.6875 \r\n",
       "L 18.40625 54.6875 \r\n",
       "L 18.40625 0 \r\n",
       "L 9.421875 0 \r\n",
       "z\r\n",
       "M 9.421875 75.984375 \r\n",
       "L 18.40625 75.984375 \r\n",
       "L 18.40625 64.59375 \r\n",
       "L 9.421875 64.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-105\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(330.829688 23.798437)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-77\"/>\r\n",
       "      <use x=\"86.279297\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "      <use x=\"127.251953\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "      <use x=\"159.039062\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "      <use x=\"190.826172\" xlink:href=\"#DejaVuSans-72\"/>\r\n",
       "      <use x=\"266.021484\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"PathCollection_4\">\r\n",
       "     <g>\r\n",
       "      <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"312.829688\" xlink:href=\"#m15e421741f\" y=\"35.851562\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_19\">\r\n",
       "     <!-- Officer -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 39.40625 66.21875 \r\n",
       "Q 28.65625 66.21875 22.328125 58.203125 \r\n",
       "Q 16.015625 50.203125 16.015625 36.375 \r\n",
       "Q 16.015625 22.609375 22.328125 14.59375 \r\n",
       "Q 28.65625 6.59375 39.40625 6.59375 \r\n",
       "Q 50.140625 6.59375 56.421875 14.59375 \r\n",
       "Q 62.703125 22.609375 62.703125 36.375 \r\n",
       "Q 62.703125 50.203125 56.421875 58.203125 \r\n",
       "Q 50.140625 66.21875 39.40625 66.21875 \r\n",
       "z\r\n",
       "M 39.40625 74.21875 \r\n",
       "Q 54.734375 74.21875 63.90625 63.9375 \r\n",
       "Q 73.09375 53.65625 73.09375 36.375 \r\n",
       "Q 73.09375 19.140625 63.90625 8.859375 \r\n",
       "Q 54.734375 -1.421875 39.40625 -1.421875 \r\n",
       "Q 24.03125 -1.421875 14.8125 8.828125 \r\n",
       "Q 5.609375 19.09375 5.609375 36.375 \r\n",
       "Q 5.609375 53.65625 14.8125 63.9375 \r\n",
       "Q 24.03125 74.21875 39.40625 74.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-79\"/>\r\n",
       "      <path d=\"M 37.109375 75.984375 \r\n",
       "L 37.109375 68.5 \r\n",
       "L 28.515625 68.5 \r\n",
       "Q 23.6875 68.5 21.796875 66.546875 \r\n",
       "Q 19.921875 64.59375 19.921875 59.515625 \r\n",
       "L 19.921875 54.6875 \r\n",
       "L 34.71875 54.6875 \r\n",
       "L 34.71875 47.703125 \r\n",
       "L 19.921875 47.703125 \r\n",
       "L 19.921875 0 \r\n",
       "L 10.890625 0 \r\n",
       "L 10.890625 47.703125 \r\n",
       "L 2.296875 47.703125 \r\n",
       "L 2.296875 54.6875 \r\n",
       "L 10.890625 54.6875 \r\n",
       "L 10.890625 58.5 \r\n",
       "Q 10.890625 67.625 15.140625 71.796875 \r\n",
       "Q 19.390625 75.984375 28.609375 75.984375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-102\"/>\r\n",
       "      <path d=\"M 48.78125 52.59375 \r\n",
       "L 48.78125 44.1875 \r\n",
       "Q 44.96875 46.296875 41.140625 47.34375 \r\n",
       "Q 37.3125 48.390625 33.40625 48.390625 \r\n",
       "Q 24.65625 48.390625 19.8125 42.84375 \r\n",
       "Q 14.984375 37.3125 14.984375 27.296875 \r\n",
       "Q 14.984375 17.28125 19.8125 11.734375 \r\n",
       "Q 24.65625 6.203125 33.40625 6.203125 \r\n",
       "Q 37.3125 6.203125 41.140625 7.25 \r\n",
       "Q 44.96875 8.296875 48.78125 10.40625 \r\n",
       "L 48.78125 2.09375 \r\n",
       "Q 45.015625 0.34375 40.984375 -0.53125 \r\n",
       "Q 36.96875 -1.421875 32.421875 -1.421875 \r\n",
       "Q 20.0625 -1.421875 12.78125 6.34375 \r\n",
       "Q 5.515625 14.109375 5.515625 27.296875 \r\n",
       "Q 5.515625 40.671875 12.859375 48.328125 \r\n",
       "Q 20.21875 56 33.015625 56 \r\n",
       "Q 37.15625 56 41.109375 55.140625 \r\n",
       "Q 45.0625 54.296875 48.78125 52.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-99\"/>\r\n",
       "      <path d=\"M 56.203125 29.59375 \r\n",
       "L 56.203125 25.203125 \r\n",
       "L 14.890625 25.203125 \r\n",
       "Q 15.484375 15.921875 20.484375 11.0625 \r\n",
       "Q 25.484375 6.203125 34.421875 6.203125 \r\n",
       "Q 39.59375 6.203125 44.453125 7.46875 \r\n",
       "Q 49.3125 8.734375 54.109375 11.28125 \r\n",
       "L 54.109375 2.78125 \r\n",
       "Q 49.265625 0.734375 44.1875 -0.34375 \r\n",
       "Q 39.109375 -1.421875 33.890625 -1.421875 \r\n",
       "Q 20.796875 -1.421875 13.15625 6.1875 \r\n",
       "Q 5.515625 13.8125 5.515625 26.8125 \r\n",
       "Q 5.515625 40.234375 12.765625 48.109375 \r\n",
       "Q 20.015625 56 32.328125 56 \r\n",
       "Q 43.359375 56 49.78125 48.890625 \r\n",
       "Q 56.203125 41.796875 56.203125 29.59375 \r\n",
       "z\r\n",
       "M 47.21875 32.234375 \r\n",
       "Q 47.125 39.59375 43.09375 43.984375 \r\n",
       "Q 39.0625 48.390625 32.421875 48.390625 \r\n",
       "Q 24.90625 48.390625 20.390625 44.140625 \r\n",
       "Q 15.875 39.890625 15.1875 32.171875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-101\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(330.829688 38.476562)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-79\"/>\r\n",
       "      <use x=\"78.710938\" xlink:href=\"#DejaVuSans-102\"/>\r\n",
       "      <use x=\"113.916016\" xlink:href=\"#DejaVuSans-102\"/>\r\n",
       "      <use x=\"149.121094\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "      <use x=\"176.904297\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"231.884766\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "      <use x=\"293.408203\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       " </g>\r\n",
       " <defs>\r\n",
       "  <clipPath id=\"pd03a50d579\">\r\n",
       "   <rect height=\"326.16\" width=\"334.8\" x=\"38.482813\" y=\"7.2\"/>\r\n",
       "  </clipPath>\r\n",
       " </defs>\r\n",
       "</svg>\r\n"
      ],
      "text/plain": [
       "<Figure size 432x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def visualize_emb(emb):\n",
    "  X = emb.weight.data.numpy()\n",
    "  pca = PCA(n_components=2)\n",
    "  components = pca.fit_transform(X)\n",
    "  plt.figure(figsize=(6, 6))\n",
    "  club1_x = []\n",
    "  club1_y = []\n",
    "  club2_x = []\n",
    "  club2_y = []\n",
    "  for node in G.nodes(data=True):\n",
    "    if node[1]['club'] == 'Mr. Hi':  #node的形式：第一个元素是索引，第二个元素是attributes字典\n",
    "      club1_x.append(components[node[0]][0])\n",
    "      club1_y.append(components[node[0]][1])\n",
    "    else:\n",
    "      club2_x.append(components[node[0]][0])\n",
    "      club2_y.append(components[node[0]][1])\n",
    "  plt.scatter(club1_x, club1_y, color=\"red\", label=\"Mr. Hi\")\n",
    "  plt.scatter(club2_x, club2_y, color=\"blue\", label=\"Officer\")\n",
    "  plt.legend()\n",
    "  plt.show()\n",
    "\n",
    "# Visualize the initial random embeddding\n",
    "visualize_emb(emb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bQIyuEz9ANb2"
   },
   "source": [
    "## Question 7: Training the embedding! What is the best performance you can get? Please report both the best loss and accuracy on Gradescope. (20 Points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {
    "id": "RDeQTNNxqH0j",
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(2.0549, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.5\n",
      "tensor(1.5708, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.5\n",
      "tensor(0.9739, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.5\n",
      "tensor(0.6756, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.5769\n",
      "tensor(0.5552, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.7051\n",
      "tensor(0.4918, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.8013\n",
      "tensor(0.4448, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.8654\n",
      "tensor(0.4033, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.9103\n",
      "tensor(0.3644, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.9359\n",
      "tensor(0.3276, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.9487\n",
      "tensor(0.2931, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.9615\n",
      "tensor(0.2612, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.9808\n",
      "tensor(0.2321, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "0.9936\n",
      "tensor(0.2061, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.1831, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.1629, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.1454, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.1302, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.1171, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.1058, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0960, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0875, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0801, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0736, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0679, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0628, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0584, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0544, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0508, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0476, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0447, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0421, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0398, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0376, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0356, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0338, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0322, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0307, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0293, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0280, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0268, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0257, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0246, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0236, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0227, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0219, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0211, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0203, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0196, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n",
      "tensor(0.0190, grad_fn=<BinaryCrossEntropyBackward>)\n",
      "1.0\n"
     ]
    }
   ],
   "source": [
    "from torch.optim import SGD\n",
    "\n",
    "def accuracy(pred, label):\n",
    "  # TODO: Implement the accuracy function. This function takes the \n",
    "  # pred tensor (the resulting tensor after sigmoid) and the label \n",
    "  # tensor (torch.LongTensor). Predicted value greater than 0.5 will \n",
    "  # be classified as label 1. Else it will be classified as label 0.\n",
    "  # The returned accuracy should be rounded to 4 decimal places. \n",
    "  # For example, accuracy 0.82956 will be rounded to 0.8296.\n",
    "\n",
    "  accu = 0.0\n",
    "\n",
    "  ############# Your code here ############\n",
    "  #accuracy=预测与实际一致的结果数/所有结果数\n",
    "  #pred tensor和label tensor都是[78*2(156)]大小的tensor\n",
    "  accu=round(((pred>0.5)==label).sum().item()/(pred.shape[0]),4)\n",
    "  #########################################\n",
    "\n",
    "  return accu\n",
    "\n",
    "def train(emb, loss_fn, sigmoid, train_label, train_edge):\n",
    "  # TODO: Train the embedding layer here. You can also change epochs and \n",
    "  # learning rate. In general, you need to implement: \n",
    "  # (1) Get the embeddings of the nodes in train_edge\n",
    "  # (2) Dot product the embeddings between each node pair\n",
    "  # (3) Feed the dot product result into sigmoid\n",
    "  # (4) Feed the sigmoid output into the loss_fn\n",
    "  # (5) Print both loss and accuracy of each epoch \n",
    "  # (as a sanity check, the loss should decrease during training)\n",
    "\n",
    "  epochs = 500\n",
    "  learning_rate = 0.1\n",
    "\n",
    "  optimizer = SGD(emb.parameters(), lr=learning_rate, momentum=0.9)\n",
    "\n",
    "  for i in range(epochs):\n",
    "\n",
    "    ############# Your code here ############\n",
    "    optimizer.zero_grad()\n",
    "    train_node_emb=emb(train_edge)  #[2,156,16]\n",
    "    dot_product_result=train_node_emb[0].mul(train_node_emb[1])  #点对之间对应位置嵌入相乘，[156,16]\n",
    "    dot_product_result=torch.sum(dot_product_result,1)  #加起来，构成点对之间向量的点积，[156]\n",
    "    sigmoid_result=sigmoid(dot_product_result)  #将这个点积结果经过激活函数映射到0,1之间\n",
    "    loss_result=loss_fn(sigmoid_result,train_label)\n",
    "    loss_result.backward()\n",
    "    optimizer.step()\n",
    "    if i%10==0:  #其实这个应该每一轮都打印一遍的，但是我嫌太大了就十轮打印一遍了\n",
    "      print(loss_result)\n",
    "      print(accuracy(sigmoid_result,train_label))\n",
    "    #########################################\n",
    "\n",
    "loss_fn = nn.BCELoss()\n",
    "sigmoid = nn.Sigmoid()\n",
    "\n",
    "# Generate the positive and negative labels\n",
    "pos_label = torch.ones(pos_edge_index.shape[1], )\n",
    "neg_label = torch.zeros(neg_edge_index.shape[1], )\n",
    "\n",
    "# Concat positive and negative labels into one tensor\n",
    "train_label = torch.cat([pos_label, neg_label], dim=0)  #横着叠\n",
    "\n",
    "# Concat positive and negative edges into one tensor\n",
    "# Since the network is very small, we do not split the edges into val/test sets\n",
    "train_edge = torch.cat([pos_edge_index, neg_edge_index], dim=1)  #竖着叠\n",
    "\n",
    "train(emb, loss_fn, sigmoid, train_label, train_edge)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "WX2PSXnTDiNi"
   },
   "source": [
    "## Visualize the final node embeddings\n",
    "Visualize your final embedding here! \n",
    "You can visually compare the figure with the previous embedding figure. \n",
    "After training, you should oberserve that the two classes are more evidently separated. \n",
    "This is a great sanitity check for your implementation as well."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {
    "id": "MtNgl4VhYKow"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\r\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
       "<!-- Created with matplotlib (https://matplotlib.org/) -->\r\n",
       "<svg height=\"357.238125pt\" version=\"1.1\" viewBox=\"0 0 370.942187 357.238125\" width=\"370.942187pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
       " <defs>\r\n",
       "  <style type=\"text/css\">\r\n",
       "*{stroke-linecap:butt;stroke-linejoin:round;}\r\n",
       "  </style>\r\n",
       " </defs>\r\n",
       " <g id=\"figure_1\">\r\n",
       "  <g id=\"patch_1\">\r\n",
       "   <path d=\"M 0 357.238125 \r\n",
       "L 370.942187 357.238125 \r\n",
       "L 370.942187 0 \r\n",
       "L 0 0 \r\n",
       "z\r\n",
       "\" style=\"fill:none;\"/>\r\n",
       "  </g>\r\n",
       "  <g id=\"axes_1\">\r\n",
       "   <g id=\"patch_2\">\r\n",
       "    <path d=\"M 28.942188 333.36 \r\n",
       "L 363.742188 333.36 \r\n",
       "L 363.742188 7.2 \r\n",
       "L 28.942188 7.2 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"PathCollection_1\">\r\n",
       "    <defs>\r\n",
       "     <path d=\"M 0 3 \r\n",
       "C 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\n",
       "C 2.683901 1.55874 3 0.795609 3 0 \r\n",
       "C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\n",
       "C 1.55874 -2.683901 0.795609 -3 0 -3 \r\n",
       "C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\n",
       "C -2.683901 -1.55874 -3 -0.795609 -3 0 \r\n",
       "C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\n",
       "C -1.55874 2.683901 -0.795609 3 0 3 \r\n",
       "z\r\n",
       "\" id=\"m4d8d7e6e50\" style=\"stroke:#ff0000;\"/>\r\n",
       "    </defs>\r\n",
       "    <g clip-path=\"url(#p9ac8ef769c)\">\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"101.243186\" xlink:href=\"#m4d8d7e6e50\" y=\"204.708867\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"75.691467\" xlink:href=\"#m4d8d7e6e50\" y=\"266.058008\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"123.375375\" xlink:href=\"#m4d8d7e6e50\" y=\"318.060812\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"58.16998\" xlink:href=\"#m4d8d7e6e50\" y=\"189.399854\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"109.125185\" xlink:href=\"#m4d8d7e6e50\" y=\"67.668755\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"159.969299\" xlink:href=\"#m4d8d7e6e50\" y=\"117.428192\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"167.503006\" xlink:href=\"#m4d8d7e6e50\" y=\"22.499188\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"78.609189\" xlink:href=\"#m4d8d7e6e50\" y=\"212.36129\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"222.362127\" xlink:href=\"#m4d8d7e6e50\" y=\"235.457747\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"78.953378\" xlink:href=\"#m4d8d7e6e50\" y=\"113.829768\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"184.465075\" xlink:href=\"#m4d8d7e6e50\" y=\"258.908381\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"78.612426\" xlink:href=\"#m4d8d7e6e50\" y=\"246.954956\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"92.457712\" xlink:href=\"#m4d8d7e6e50\" y=\"243.699347\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"117.358394\" xlink:href=\"#m4d8d7e6e50\" y=\"109.24395\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"196.285977\" xlink:href=\"#m4d8d7e6e50\" y=\"239.063145\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"165.128986\" xlink:href=\"#m4d8d7e6e50\" y=\"252.405311\"/>\r\n",
       "     <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"44.662115\" xlink:href=\"#m4d8d7e6e50\" y=\"120.08896\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"PathCollection_2\">\r\n",
       "    <defs>\r\n",
       "     <path d=\"M 0 3 \r\n",
       "C 0.795609 3 1.55874 2.683901 2.12132 2.12132 \r\n",
       "C 2.683901 1.55874 3 0.795609 3 0 \r\n",
       "C 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \r\n",
       "C 1.55874 -2.683901 0.795609 -3 0 -3 \r\n",
       "C -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \r\n",
       "C -2.683901 -1.55874 -3 -0.795609 -3 0 \r\n",
       "C -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \r\n",
       "C -1.55874 2.683901 -0.795609 3 0 3 \r\n",
       "z\r\n",
       "\" id=\"mc0377716a3\" style=\"stroke:#0000ff;\"/>\r\n",
       "    </defs>\r\n",
       "    <g clip-path=\"url(#p9ac8ef769c)\">\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"130.098182\" xlink:href=\"#mc0377716a3\" y=\"246.62566\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"272.892261\" xlink:href=\"#mc0377716a3\" y=\"193.481166\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"307.292408\" xlink:href=\"#mc0377716a3\" y=\"103.060388\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"159.721225\" xlink:href=\"#mc0377716a3\" y=\"160.150088\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"289.227975\" xlink:href=\"#mc0377716a3\" y=\"129.519585\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"287.706705\" xlink:href=\"#mc0377716a3\" y=\"177.183771\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"223.188853\" xlink:href=\"#mc0377716a3\" y=\"165.579643\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"276.470812\" xlink:href=\"#mc0377716a3\" y=\"193.18345\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"248.513885\" xlink:href=\"#mc0377716a3\" y=\"259.477349\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"269.129223\" xlink:href=\"#mc0377716a3\" y=\"147.234026\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"213.653268\" xlink:href=\"#mc0377716a3\" y=\"262.594457\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"257.381991\" xlink:href=\"#mc0377716a3\" y=\"209.59988\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"245.384155\" xlink:href=\"#mc0377716a3\" y=\"146.423916\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"254.233143\" xlink:href=\"#mc0377716a3\" y=\"221.365137\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"292.75954\" xlink:href=\"#mc0377716a3\" y=\"164.469777\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"346.762591\" xlink:href=\"#mc0377716a3\" y=\"230.680343\"/>\r\n",
       "     <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"290.147664\" xlink:href=\"#mc0377716a3\" y=\"244.40708\"/>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_1\">\r\n",
       "    <g id=\"xtick_1\">\r\n",
       "     <g id=\"line2d_1\">\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 0 0 \r\n",
       "L 0 3.5 \r\n",
       "\" id=\"m6cdfa62e73\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
       "      </defs>\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"76.79079\" xlink:href=\"#m6cdfa62e73\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_1\">\r\n",
       "      <!-- −2 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 10.59375 35.5 \r\n",
       "L 73.1875 35.5 \r\n",
       "L 73.1875 27.203125 \r\n",
       "L 10.59375 27.203125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-8722\"/>\r\n",
       "       <path d=\"M 19.1875 8.296875 \r\n",
       "L 53.609375 8.296875 \r\n",
       "L 53.609375 0 \r\n",
       "L 7.328125 0 \r\n",
       "L 7.328125 8.296875 \r\n",
       "Q 12.9375 14.109375 22.625 23.890625 \r\n",
       "Q 32.328125 33.6875 34.8125 36.53125 \r\n",
       "Q 39.546875 41.84375 41.421875 45.53125 \r\n",
       "Q 43.3125 49.21875 43.3125 52.78125 \r\n",
       "Q 43.3125 58.59375 39.234375 62.25 \r\n",
       "Q 35.15625 65.921875 28.609375 65.921875 \r\n",
       "Q 23.96875 65.921875 18.8125 64.3125 \r\n",
       "Q 13.671875 62.703125 7.8125 59.421875 \r\n",
       "L 7.8125 69.390625 \r\n",
       "Q 13.765625 71.78125 18.9375 73 \r\n",
       "Q 24.125 74.21875 28.421875 74.21875 \r\n",
       "Q 39.75 74.21875 46.484375 68.546875 \r\n",
       "Q 53.21875 62.890625 53.21875 53.421875 \r\n",
       "Q 53.21875 48.921875 51.53125 44.890625 \r\n",
       "Q 49.859375 40.875 45.40625 35.40625 \r\n",
       "Q 44.1875 33.984375 37.640625 27.21875 \r\n",
       "Q 31.109375 20.453125 19.1875 8.296875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-50\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(69.419696 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_2\">\r\n",
       "     <g id=\"line2d_2\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"132.78564\" xlink:href=\"#m6cdfa62e73\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_2\">\r\n",
       "      <!-- −1 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 12.40625 8.296875 \r\n",
       "L 28.515625 8.296875 \r\n",
       "L 28.515625 63.921875 \r\n",
       "L 10.984375 60.40625 \r\n",
       "L 10.984375 69.390625 \r\n",
       "L 28.421875 72.90625 \r\n",
       "L 38.28125 72.90625 \r\n",
       "L 38.28125 8.296875 \r\n",
       "L 54.390625 8.296875 \r\n",
       "L 54.390625 0 \r\n",
       "L 12.40625 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-49\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(125.414546 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-49\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_3\">\r\n",
       "     <g id=\"line2d_3\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"188.780489\" xlink:href=\"#m6cdfa62e73\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_3\">\r\n",
       "      <!-- 0 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 31.78125 66.40625 \r\n",
       "Q 24.171875 66.40625 20.328125 58.90625 \r\n",
       "Q 16.5 51.421875 16.5 36.375 \r\n",
       "Q 16.5 21.390625 20.328125 13.890625 \r\n",
       "Q 24.171875 6.390625 31.78125 6.390625 \r\n",
       "Q 39.453125 6.390625 43.28125 13.890625 \r\n",
       "Q 47.125 21.390625 47.125 36.375 \r\n",
       "Q 47.125 51.421875 43.28125 58.90625 \r\n",
       "Q 39.453125 66.40625 31.78125 66.40625 \r\n",
       "z\r\n",
       "M 31.78125 74.21875 \r\n",
       "Q 44.046875 74.21875 50.515625 64.515625 \r\n",
       "Q 56.984375 54.828125 56.984375 36.375 \r\n",
       "Q 56.984375 17.96875 50.515625 8.265625 \r\n",
       "Q 44.046875 -1.421875 31.78125 -1.421875 \r\n",
       "Q 19.53125 -1.421875 13.0625 8.265625 \r\n",
       "Q 6.59375 17.96875 6.59375 36.375 \r\n",
       "Q 6.59375 54.828125 13.0625 64.515625 \r\n",
       "Q 19.53125 74.21875 31.78125 74.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-48\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(185.599239 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_4\">\r\n",
       "     <g id=\"line2d_4\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"244.775339\" xlink:href=\"#m6cdfa62e73\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_4\">\r\n",
       "      <!-- 1 -->\r\n",
       "      <g transform=\"translate(241.594089 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-49\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_5\">\r\n",
       "     <g id=\"line2d_5\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"300.770188\" xlink:href=\"#m6cdfa62e73\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_5\">\r\n",
       "      <!-- 2 -->\r\n",
       "      <g transform=\"translate(297.588938 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"xtick_6\">\r\n",
       "     <g id=\"line2d_6\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"356.765038\" xlink:href=\"#m6cdfa62e73\" y=\"333.36\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_6\">\r\n",
       "      <!-- 3 -->\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 40.578125 39.3125 \r\n",
       "Q 47.65625 37.796875 51.625 33 \r\n",
       "Q 55.609375 28.21875 55.609375 21.1875 \r\n",
       "Q 55.609375 10.40625 48.1875 4.484375 \r\n",
       "Q 40.765625 -1.421875 27.09375 -1.421875 \r\n",
       "Q 22.515625 -1.421875 17.65625 -0.515625 \r\n",
       "Q 12.796875 0.390625 7.625 2.203125 \r\n",
       "L 7.625 11.71875 \r\n",
       "Q 11.71875 9.328125 16.59375 8.109375 \r\n",
       "Q 21.484375 6.890625 26.8125 6.890625 \r\n",
       "Q 36.078125 6.890625 40.9375 10.546875 \r\n",
       "Q 45.796875 14.203125 45.796875 21.1875 \r\n",
       "Q 45.796875 27.640625 41.28125 31.265625 \r\n",
       "Q 36.765625 34.90625 28.71875 34.90625 \r\n",
       "L 20.21875 34.90625 \r\n",
       "L 20.21875 43.015625 \r\n",
       "L 29.109375 43.015625 \r\n",
       "Q 36.375 43.015625 40.234375 45.921875 \r\n",
       "Q 44.09375 48.828125 44.09375 54.296875 \r\n",
       "Q 44.09375 59.90625 40.109375 62.90625 \r\n",
       "Q 36.140625 65.921875 28.71875 65.921875 \r\n",
       "Q 24.65625 65.921875 20.015625 65.03125 \r\n",
       "Q 15.375 64.15625 9.8125 62.3125 \r\n",
       "L 9.8125 71.09375 \r\n",
       "Q 15.4375 72.65625 20.34375 73.4375 \r\n",
       "Q 25.25 74.21875 29.59375 74.21875 \r\n",
       "Q 40.828125 74.21875 47.359375 69.109375 \r\n",
       "Q 53.90625 64.015625 53.90625 55.328125 \r\n",
       "Q 53.90625 49.265625 50.4375 45.09375 \r\n",
       "Q 46.96875 40.921875 40.578125 39.3125 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-51\"/>\r\n",
       "      </defs>\r\n",
       "      <g transform=\"translate(353.583788 347.958438)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-51\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"matplotlib.axis_2\">\r\n",
       "    <g id=\"ytick_1\">\r\n",
       "     <g id=\"line2d_7\">\r\n",
       "      <defs>\r\n",
       "       <path d=\"M 0 0 \r\n",
       "L -3.5 0 \r\n",
       "\" id=\"mcf5daa1517\" style=\"stroke:#000000;stroke-width:0.8;\"/>\r\n",
       "      </defs>\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"28.942188\" xlink:href=\"#mcf5daa1517\" y=\"293.387102\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_7\">\r\n",
       "      <!-- −2 -->\r\n",
       "      <g transform=\"translate(7.2 297.186321)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_2\">\r\n",
       "     <g id=\"line2d_8\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"28.942188\" xlink:href=\"#mcf5daa1517\" y=\"241.882848\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_8\">\r\n",
       "      <!-- −1 -->\r\n",
       "      <g transform=\"translate(7.2 245.682067)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-8722\"/>\r\n",
       "       <use x=\"83.789062\" xlink:href=\"#DejaVuSans-49\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_3\">\r\n",
       "     <g id=\"line2d_9\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"28.942188\" xlink:href=\"#mcf5daa1517\" y=\"190.378594\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_9\">\r\n",
       "      <!-- 0 -->\r\n",
       "      <g transform=\"translate(15.579688 194.177813)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-48\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_4\">\r\n",
       "     <g id=\"line2d_10\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"28.942188\" xlink:href=\"#mcf5daa1517\" y=\"138.87434\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_10\">\r\n",
       "      <!-- 1 -->\r\n",
       "      <g transform=\"translate(15.579688 142.673559)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-49\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_5\">\r\n",
       "     <g id=\"line2d_11\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"28.942188\" xlink:href=\"#mcf5daa1517\" y=\"87.370086\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_11\">\r\n",
       "      <!-- 2 -->\r\n",
       "      <g transform=\"translate(15.579688 91.169305)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-50\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"ytick_6\">\r\n",
       "     <g id=\"line2d_12\">\r\n",
       "      <g>\r\n",
       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"28.942188\" xlink:href=\"#mcf5daa1517\" y=\"35.865832\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "     <g id=\"text_12\">\r\n",
       "      <!-- 3 -->\r\n",
       "      <g transform=\"translate(15.579688 39.665051)scale(0.1 -0.1)\">\r\n",
       "       <use xlink:href=\"#DejaVuSans-51\"/>\r\n",
       "      </g>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_3\">\r\n",
       "    <path d=\"M 28.942188 333.36 \r\n",
       "L 28.942188 7.2 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_4\">\r\n",
       "    <path d=\"M 363.742188 333.36 \r\n",
       "L 363.742188 7.2 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_5\">\r\n",
       "    <path d=\"M 28.942187 333.36 \r\n",
       "L 363.742188 333.36 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"patch_6\">\r\n",
       "    <path d=\"M 28.942187 7.2 \r\n",
       "L 363.742188 7.2 \r\n",
       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\r\n",
       "   </g>\r\n",
       "   <g id=\"legend_1\">\r\n",
       "    <g id=\"patch_7\">\r\n",
       "     <path d=\"M 291.289062 44.55625 \r\n",
       "L 356.742188 44.55625 \r\n",
       "Q 358.742188 44.55625 358.742188 42.55625 \r\n",
       "L 358.742188 14.2 \r\n",
       "Q 358.742188 12.2 356.742188 12.2 \r\n",
       "L 291.289062 12.2 \r\n",
       "Q 289.289062 12.2 289.289062 14.2 \r\n",
       "L 289.289062 42.55625 \r\n",
       "Q 289.289062 44.55625 291.289062 44.55625 \r\n",
       "z\r\n",
       "\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\r\n",
       "    </g>\r\n",
       "    <g id=\"PathCollection_3\">\r\n",
       "     <g>\r\n",
       "      <use style=\"fill:#ff0000;stroke:#ff0000;\" x=\"303.289062\" xlink:href=\"#m4d8d7e6e50\" y=\"21.173437\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_13\">\r\n",
       "     <!-- Mr. Hi -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 9.8125 72.90625 \r\n",
       "L 24.515625 72.90625 \r\n",
       "L 43.109375 23.296875 \r\n",
       "L 61.8125 72.90625 \r\n",
       "L 76.515625 72.90625 \r\n",
       "L 76.515625 0 \r\n",
       "L 66.890625 0 \r\n",
       "L 66.890625 64.015625 \r\n",
       "L 48.09375 14.015625 \r\n",
       "L 38.1875 14.015625 \r\n",
       "L 19.390625 64.015625 \r\n",
       "L 19.390625 0 \r\n",
       "L 9.8125 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-77\"/>\r\n",
       "      <path d=\"M 41.109375 46.296875 \r\n",
       "Q 39.59375 47.171875 37.8125 47.578125 \r\n",
       "Q 36.03125 48 33.890625 48 \r\n",
       "Q 26.265625 48 22.1875 43.046875 \r\n",
       "Q 18.109375 38.09375 18.109375 28.8125 \r\n",
       "L 18.109375 0 \r\n",
       "L 9.078125 0 \r\n",
       "L 9.078125 54.6875 \r\n",
       "L 18.109375 54.6875 \r\n",
       "L 18.109375 46.1875 \r\n",
       "Q 20.953125 51.171875 25.484375 53.578125 \r\n",
       "Q 30.03125 56 36.53125 56 \r\n",
       "Q 37.453125 56 38.578125 55.875 \r\n",
       "Q 39.703125 55.765625 41.0625 55.515625 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-114\"/>\r\n",
       "      <path d=\"M 10.6875 12.40625 \r\n",
       "L 21 12.40625 \r\n",
       "L 21 0 \r\n",
       "L 10.6875 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-46\"/>\r\n",
       "      <path id=\"DejaVuSans-32\"/>\r\n",
       "      <path d=\"M 9.8125 72.90625 \r\n",
       "L 19.671875 72.90625 \r\n",
       "L 19.671875 43.015625 \r\n",
       "L 55.515625 43.015625 \r\n",
       "L 55.515625 72.90625 \r\n",
       "L 65.375 72.90625 \r\n",
       "L 65.375 0 \r\n",
       "L 55.515625 0 \r\n",
       "L 55.515625 34.71875 \r\n",
       "L 19.671875 34.71875 \r\n",
       "L 19.671875 0 \r\n",
       "L 9.8125 0 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-72\"/>\r\n",
       "      <path d=\"M 9.421875 54.6875 \r\n",
       "L 18.40625 54.6875 \r\n",
       "L 18.40625 0 \r\n",
       "L 9.421875 0 \r\n",
       "z\r\n",
       "M 9.421875 75.984375 \r\n",
       "L 18.40625 75.984375 \r\n",
       "L 18.40625 64.59375 \r\n",
       "L 9.421875 64.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-105\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(321.289062 23.798437)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-77\"/>\r\n",
       "      <use x=\"86.279297\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "      <use x=\"127.251953\" xlink:href=\"#DejaVuSans-46\"/>\r\n",
       "      <use x=\"159.039062\" xlink:href=\"#DejaVuSans-32\"/>\r\n",
       "      <use x=\"190.826172\" xlink:href=\"#DejaVuSans-72\"/>\r\n",
       "      <use x=\"266.021484\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"PathCollection_4\">\r\n",
       "     <g>\r\n",
       "      <use style=\"fill:#0000ff;stroke:#0000ff;\" x=\"303.289062\" xlink:href=\"#mc0377716a3\" y=\"35.851562\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "    <g id=\"text_14\">\r\n",
       "     <!-- Officer -->\r\n",
       "     <defs>\r\n",
       "      <path d=\"M 39.40625 66.21875 \r\n",
       "Q 28.65625 66.21875 22.328125 58.203125 \r\n",
       "Q 16.015625 50.203125 16.015625 36.375 \r\n",
       "Q 16.015625 22.609375 22.328125 14.59375 \r\n",
       "Q 28.65625 6.59375 39.40625 6.59375 \r\n",
       "Q 50.140625 6.59375 56.421875 14.59375 \r\n",
       "Q 62.703125 22.609375 62.703125 36.375 \r\n",
       "Q 62.703125 50.203125 56.421875 58.203125 \r\n",
       "Q 50.140625 66.21875 39.40625 66.21875 \r\n",
       "z\r\n",
       "M 39.40625 74.21875 \r\n",
       "Q 54.734375 74.21875 63.90625 63.9375 \r\n",
       "Q 73.09375 53.65625 73.09375 36.375 \r\n",
       "Q 73.09375 19.140625 63.90625 8.859375 \r\n",
       "Q 54.734375 -1.421875 39.40625 -1.421875 \r\n",
       "Q 24.03125 -1.421875 14.8125 8.828125 \r\n",
       "Q 5.609375 19.09375 5.609375 36.375 \r\n",
       "Q 5.609375 53.65625 14.8125 63.9375 \r\n",
       "Q 24.03125 74.21875 39.40625 74.21875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-79\"/>\r\n",
       "      <path d=\"M 37.109375 75.984375 \r\n",
       "L 37.109375 68.5 \r\n",
       "L 28.515625 68.5 \r\n",
       "Q 23.6875 68.5 21.796875 66.546875 \r\n",
       "Q 19.921875 64.59375 19.921875 59.515625 \r\n",
       "L 19.921875 54.6875 \r\n",
       "L 34.71875 54.6875 \r\n",
       "L 34.71875 47.703125 \r\n",
       "L 19.921875 47.703125 \r\n",
       "L 19.921875 0 \r\n",
       "L 10.890625 0 \r\n",
       "L 10.890625 47.703125 \r\n",
       "L 2.296875 47.703125 \r\n",
       "L 2.296875 54.6875 \r\n",
       "L 10.890625 54.6875 \r\n",
       "L 10.890625 58.5 \r\n",
       "Q 10.890625 67.625 15.140625 71.796875 \r\n",
       "Q 19.390625 75.984375 28.609375 75.984375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-102\"/>\r\n",
       "      <path d=\"M 48.78125 52.59375 \r\n",
       "L 48.78125 44.1875 \r\n",
       "Q 44.96875 46.296875 41.140625 47.34375 \r\n",
       "Q 37.3125 48.390625 33.40625 48.390625 \r\n",
       "Q 24.65625 48.390625 19.8125 42.84375 \r\n",
       "Q 14.984375 37.3125 14.984375 27.296875 \r\n",
       "Q 14.984375 17.28125 19.8125 11.734375 \r\n",
       "Q 24.65625 6.203125 33.40625 6.203125 \r\n",
       "Q 37.3125 6.203125 41.140625 7.25 \r\n",
       "Q 44.96875 8.296875 48.78125 10.40625 \r\n",
       "L 48.78125 2.09375 \r\n",
       "Q 45.015625 0.34375 40.984375 -0.53125 \r\n",
       "Q 36.96875 -1.421875 32.421875 -1.421875 \r\n",
       "Q 20.0625 -1.421875 12.78125 6.34375 \r\n",
       "Q 5.515625 14.109375 5.515625 27.296875 \r\n",
       "Q 5.515625 40.671875 12.859375 48.328125 \r\n",
       "Q 20.21875 56 33.015625 56 \r\n",
       "Q 37.15625 56 41.109375 55.140625 \r\n",
       "Q 45.0625 54.296875 48.78125 52.59375 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-99\"/>\r\n",
       "      <path d=\"M 56.203125 29.59375 \r\n",
       "L 56.203125 25.203125 \r\n",
       "L 14.890625 25.203125 \r\n",
       "Q 15.484375 15.921875 20.484375 11.0625 \r\n",
       "Q 25.484375 6.203125 34.421875 6.203125 \r\n",
       "Q 39.59375 6.203125 44.453125 7.46875 \r\n",
       "Q 49.3125 8.734375 54.109375 11.28125 \r\n",
       "L 54.109375 2.78125 \r\n",
       "Q 49.265625 0.734375 44.1875 -0.34375 \r\n",
       "Q 39.109375 -1.421875 33.890625 -1.421875 \r\n",
       "Q 20.796875 -1.421875 13.15625 6.1875 \r\n",
       "Q 5.515625 13.8125 5.515625 26.8125 \r\n",
       "Q 5.515625 40.234375 12.765625 48.109375 \r\n",
       "Q 20.015625 56 32.328125 56 \r\n",
       "Q 43.359375 56 49.78125 48.890625 \r\n",
       "Q 56.203125 41.796875 56.203125 29.59375 \r\n",
       "z\r\n",
       "M 47.21875 32.234375 \r\n",
       "Q 47.125 39.59375 43.09375 43.984375 \r\n",
       "Q 39.0625 48.390625 32.421875 48.390625 \r\n",
       "Q 24.90625 48.390625 20.390625 44.140625 \r\n",
       "Q 15.875 39.890625 15.1875 32.171875 \r\n",
       "z\r\n",
       "\" id=\"DejaVuSans-101\"/>\r\n",
       "     </defs>\r\n",
       "     <g transform=\"translate(321.289062 38.476562)scale(0.1 -0.1)\">\r\n",
       "      <use xlink:href=\"#DejaVuSans-79\"/>\r\n",
       "      <use x=\"78.710938\" xlink:href=\"#DejaVuSans-102\"/>\r\n",
       "      <use x=\"113.916016\" xlink:href=\"#DejaVuSans-102\"/>\r\n",
       "      <use x=\"149.121094\" xlink:href=\"#DejaVuSans-105\"/>\r\n",
       "      <use x=\"176.904297\" xlink:href=\"#DejaVuSans-99\"/>\r\n",
       "      <use x=\"231.884766\" xlink:href=\"#DejaVuSans-101\"/>\r\n",
       "      <use x=\"293.408203\" xlink:href=\"#DejaVuSans-114\"/>\r\n",
       "     </g>\r\n",
       "    </g>\r\n",
       "   </g>\r\n",
       "  </g>\r\n",
       " </g>\r\n",
       " <defs>\r\n",
       "  <clipPath id=\"p9ac8ef769c\">\r\n",
       "   <rect height=\"326.16\" width=\"334.8\" x=\"28.942188\" y=\"7.2\"/>\r\n",
       "  </clipPath>\r\n",
       " </defs>\r\n",
       "</svg>\r\n"
      ],
      "text/plain": [
       "<Figure size 432x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize the final learned embedding\n",
    "#如果两种社群分类合理，而且节点嵌入的训练也合理，那么两种社群的嵌入就应该是有所分离的。\n",
    "#我跑了几次，这是分得比较开的情况之一……\n",
    "#参考答案上面那个怎么分那么开的？难道这就是脸黑吗？\n",
    "visualize_emb(emb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "machine_shape": "hm",
   "name": "CS224W - Colab 1.ipynb",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}